From 627d488db3aa71406e32d4d8934629e8b0f35905 Mon Sep 17 00:00:00 2001
From: Jan Kiszka <jan.kiszka@siemens.com>
Date: Sat, 16 Oct 2021 15:46:33 +0200
Subject: [PATCH] lib/{cobalt,copperplate}: Use valid addresses for
 pthread_setspecific

glibx 2.34 and newer annotated pthread_setspecific in a way that gcc-11
complains about non-NULL pointers that are outside of what is considered
valid. So use dummy addresses instead. namely the related pthread keys.
Those pointers will never be dereferenced in both use cases.

See also https://sourceware.org/bugzilla/show_bug.cgi?id=28458.

Reported-by: Vitaly Chikunov <vt@altlinux.org>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>

[Retrieved from:
https://source.denx.de/Xenomai/xenomai/-/commit/627d488db3aa71406e32d4d8934629e8b0f35905]
Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
---
 include/copperplate/threadobj.h | 6 +++++-
 lib/cobalt/printf.c             | 2 +-
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/include/copperplate/threadobj.h b/include/copperplate/threadobj.h
index 7e6904f4c..c8363415b 100644
--- a/include/copperplate/threadobj.h
+++ b/include/copperplate/threadobj.h
@@ -173,7 +173,11 @@ void threadobj_save_timeout(struct threadobj_corespec *corespec,
 #define __THREAD_M_SPARE6	(1 << 22)
 #define __THREAD_M_SPARE7	(1 << 23)
 
-#define THREADOBJ_IRQCONTEXT    ((struct threadobj *)-2UL)
+/*
+ * We need to use a valid address here. The object will never be dereferenced
+ * when it is identified as IRQ context, so the pthread key itself is fine.
+ */
+#define THREADOBJ_IRQCONTEXT	((struct threadobj *)&threadobj_tskey)
 
 struct traceobj;
 struct syncobj;
diff --git a/lib/cobalt/printf.c b/lib/cobalt/printf.c
index 8982ddc93..0aa5940c6 100644
--- a/lib/cobalt/printf.c
+++ b/lib/cobalt/printf.c
@@ -729,7 +729,7 @@ done:
 	pthread_cond_init(&printer_wakeup, NULL);
 	spawn_printer_thread();
 	/* We just need a non-zero TSD to trigger the dtor upon unwinding. */
-	pthread_setspecific(cleanup_key, (void *)1);
+	pthread_setspecific(cleanup_key, &cleanup_key);
 
 	atexit(rt_print_flush_buffers);
 }
-- 
GitLab

